package org.bcos.web3j.crypto.sm2.crypto;

/**
 * the interface stream ciphers conform to.
 */
public interface StreamCipher {
	/**
	 * Initialise the cipher.
	 *
	 * @param forEncryption
	 *            if true the cipher is initialised for encryption, if false for
	 *            decryption.
	 * @param params
	 *            the key and other data required by the cipher.
	 * @exception IllegalArgumentException
	 *                if the params argument is inappropriate.
	 */
	public void init(boolean forEncryption, CipherParameters params)
			throws IllegalArgumentException;

	/**
	 * Return the name of the algorithm the cipher implements.
	 *
	 * @return the name of the algorithm the cipher implements.
	 */
	public String getAlgorithmName();

	/**
	 * encrypt/decrypt a single byte returning the result.
	 *
	 * @param in
	 *            the byte to be processed.
	 * @return the result of processing the input byte.
	 */
	public byte returnByte(byte in);

	/**
	 * process a block of bytes from in putting the result into out.
	 *
	 * @param in
	 *            the input byte array.
	 * @param inOff
	 *            the offset into the in array where the data to be processed
	 *            starts.
	 * @param len
	 *            the number of bytes to be processed.
	 * @param out
	 *            the output buffer the processed bytes go into.
	 * @param outOff
	 *            the offset into the output byte array the processed data
	 *            starts at.
	 * @return the number of bytes produced - should always be len.
	 * @exception DataLengthException
	 *                if the output buffer is too small.
	 */
	public int processBytes(byte[] in, int inOff, int len, byte[] out,
                            int outOff) throws DataLengthException;

	/**
	 * reset the cipher. This leaves it in the same state it was at after the
	 * last init (if there was one).
	 */
	public void reset();
}
